package com.example.cloud.util;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

@Slf4j
@Component
@RequiredArgsConstructor
public class BatchInsertUtil {

    private final JdbcTemplate jdbcTemplate;
    private final NamedParameterJdbcTemplate namedParameterJdbcTemplate;
    
    /**
     * 批量插入数据
     * @param sql SQL语句
     * @param batchArgs 批量参数
     * @return 影响的行数
     */
    @Transactional(rollbackFor = Exception.class)
    public int[] batchUpdate(String sql, List<Object[]> batchArgs) {
        long startTime = System.currentTimeMillis();
        int[] result = jdbcTemplate.batchUpdate(sql, batchArgs);
        long endTime = System.currentTimeMillis();
        log.info("批量插入 {} 条数据，耗时 {} 毫秒", batchArgs.size(), (endTime - startTime));
        return result;
    }
    
    /**
     * 批量插入数据（使用命名参数）
     * @param sql SQL语句
     * @param entities 实体对象列表
     * @return 影响的行数
     */
    @Transactional(rollbackFor = Exception.class)
    public int[] batchUpdateWithEntities(String sql, List<? extends Object> entities) {
        long startTime = System.currentTimeMillis();
        SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(entities.toArray());
        int[] result = namedParameterJdbcTemplate.batchUpdate(sql, batch);
        long endTime = System.currentTimeMillis();
        log.info("批量插入 {} 条数据，耗时 {} 毫秒", entities.size(), (endTime - startTime));
        return result;
    }
    
    /**
     * 批量插入数据（使用Map）
     * @param sql SQL语句
     * @param batchValues Map列表
     * @return 影响的行数
     */
    @Transactional(rollbackFor = Exception.class)
    public int[] batchUpdateWithMap(String sql, List<Map<String, Object>> batchValues) {
        long startTime = System.currentTimeMillis();
        SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(batchValues.toArray(new Map[0]));
        int[] result = namedParameterJdbcTemplate.batchUpdate(sql, batch);
        long endTime = System.currentTimeMillis();
        log.info("批量插入 {} 条数据，耗时 {} 毫秒", batchValues.size(), (endTime - startTime));
        return result;
    }
} 